#include <cstdlib>
#include <string>
#include <iostream>
#include <memory>
#include <array>

#include "service.h"

using namespace std;

string ExecCommand(const char* cmd) {
    // 用于读取命令输出的缓冲区
    array<char, 128> buffer;
    // 命令的输出结果
    string result;
    // 用于读取命令输出的管道
    unique_ptr<FILE, decltype(&pclose)> pipe(popen(cmd, "r"), pclose);
    // 检查管道是否打开成功
    if (!pipe) {
        cout << "popen() 失败\n";
        throw runtime_error("popen() 失败！");
    }
    // 读取命令的输出并添加到结果中，并筛除grep命令的输出
    while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
        auto rst = string(buffer.data());
        if (rst.find("grep") != string::npos) {
            continue;
        }
        result += buffer.data();
    }
    cout << result ;

    // 返回命令的输出结果
    return result;
}

void ManageSoftbusServer(bool enable) {
    const string grepCommand = string("ps -aux | grep ") + SOFTBUS_SERVER_CMD_NAME;
    string commandOutput = ExecCommand(grepCommand.c_str());
    if (
        // 如果没有启动软总线则跳过关闭流程
        (commandOutput.empty() && !enable) ||
        // 如果已经启动则跳过启动流程
        (!commandOutput.empty() && enable)
        ) 
        {
            cout << "软总线服务已经" << (enable ? "启动" : "关闭") << "\n";
            return;
        }
    
    // start 或 stop 方法
    const char* method = enable ? CONNECTIVITY_MANAGER_START_METHOD_NAME :
                             CONNECTIVITY_MANAGER_STOP_METHOD_NAME;
    // 根据方法名启动或停止软总线服务
    const string cmd = string("dbus-send --system --dest=") + CONNECTIVITY_MANAGER_DBUS_NAME + " --type=method_call --print-reply / " + method; 
    system(cmd.c_str());
}

void SetupSoftbusClient() {
    const string grepCommand = string("ps -aux | grep ") + SOFTBUS_CLINET_CMD_NAME;
    string commandOutput = ExecCommand(grepCommand.c_str());
        // 如果已经启动则跳过启动流程
    if (!commandOutput.empty()) 
    {
        cout << "软总线客户端已经启动\n";
        return;
    }
    else
    {
        cout << "软总线客户端未启动\n";
    }

    system(SOFTBUS_CLINET_CMD_NAME);
}